package com.topwalk.datacollect.util;

import java.util.UUID;

/**
 * 主键工厂类
 * .
 * <p>
 * -----------------------------------------------------------------------------
 * <p>
 * 工程名 ： Topwalk-BDP
 * <p>
 * 授权 : (C) Copyright topwalk Corporation 2000-2015
 * <p>
 * 公司 : 北京天行网安信息技术有限责任公司
 * <p>
 * -----------------------------------------------------------------------------
 * <p>
 * <font color="#FF0000">注意: 本内容仅限于北京天行网安公司内部使用，禁止转发</font>
 * <p>
 * 
 * @version 1.0
 * @author 任文超
 * @createDate 2015年7月6日
 * @since JDK1.8
 */
public class KeyFactory {
	/** 字符集 */
	private final static char[] CHARRACTERS = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
	/** 计数器 */
	private static int count = 0;
	/**
	 * 字符数组索引计数器
	 * @return
	 */
	synchronized
	private static int getIndex(){
		if(count == Integer.MAX_VALUE){
			count = 0;
		}
		return count++ % CHARRACTERS.length;
	}

	/**
	 * UUID是一种定长算法（36位含四个'-'）
	 * 例如：3e1978dd-90c0-417e-b99c-a03b2336c3bf
	 * @return 新的UUID
	 */
	public final static String newUUID(){
		return UUID.randomUUID().toString();
	}
	
	/**
	 * 根据日期创建15位长度的新id
	 * @return 精确到秒的24小时时间格式附加一位随机字母
	 */
	public final static String newId(){
		return createId(15);
	}
	
	/**
	 * 创建指定长度的新id
	 * @param length
	 * @return
	 */
	public final static String createId(final int length){
		if(count%62 == 0){
			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		StringBuffer builder = new StringBuffer();
		builder.append(System.currentTimeMillis()%1000000000000000L);
		for(int i=builder.length(); i<length; i++){
			builder.append(CHARRACTERS[getIndex()]);
		}
		String id = builder.toString();
		releaseCache(builder);
		return id;
	}
	
	/**
	 * 释放字符序列的缓存空间<br>
	 * 支持StringBuffer和StringBuilder
	 * @param cs
	 */
	public static void releaseCache(CharSequence cs){
		if(cs instanceof StringBuffer){
			((StringBuffer) cs).delete(0, cs.length()).trimToSize();
		}
		if(cs instanceof StringBuilder){
			((StringBuilder) cs).delete(0, cs.length()).trimToSize();
		}
	}

}